package model

import (
	"fmt"
	"github.com/spf13/viper"
	entityChatModels "github.com/wejectchen/ginblog/entity/entity_chat_models"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"os"
	"time"
)

var db *gorm.DB
var err error
var UseMysql *gorm.DB

func InitDb() {
	dns := viper.GetString("mysql.dns")
	db, err = gorm.Open(mysql.Open(dns), &gorm.Config{
		// gorm日志模式：silent
		//Logger: logger.Default.LogMode(logger.Silent), 不显示SQL
		Logger: logger.Default.LogMode(logger.Info), // 显示所有SQL
		// 外键约束
		DisableForeignKeyConstraintWhenMigrating: true,
		// 禁用默认事务（提高运行速度）
		SkipDefaultTransaction: true,
		NamingStrategy: schema.NamingStrategy{
			// 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
			SingularTable: true,
		},
	})
	UseMysql = db
	if err != nil {
		fmt.Println("连接数据库失败，请检查参数：", err)
		os.Exit(1)
	}
	initChatModels()
}

// 初始化聊天系统的数据库
func initChatModels() {
	_ = db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8")
	err := db.AutoMigrate(&entityChatModels.UserBasic{}, &entityChatModels.Banner{})
	if err != nil {
		fmt.Println("初始化聊天系统数据库失败", err)
		return
	}
}

// 初始化博客系统的数据库
func initBlogModels() {
	// 迁移数据表，在没有数据表结构变更时候，建议注释不执行
	// 注意:初次运行后可注销此行
	_ = db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&User{}, &Article{}, &Category{}, Profile{}, Comment{})

	sqlDB, _ := db.DB()
	// SetMaxIdleCons 设置连接池中的最大闲置连接数。
	sqlDB.SetMaxIdleConns(10)

	// SetMaxOpenCons 设置数据库的最大连接数量。
	sqlDB.SetMaxOpenConns(100)

	// SetConnMaxLifetiment 设置连接的最大可复用时间。
	sqlDB.SetConnMaxLifetime(10 * time.Second)
}
